# -*- codeing = Utf-8 -*-
# @Time : 2022/10/28 9:05
# @Author : Leot
# @File : spider.py
# @Software : PyCharm

from bs4 import BeautifulSoup         #网页解析，获取数据
import re           #正则表达式，进行文字匹配
import urllib.request,urllib.error          #制定URL，获取网页数据
import sqlite3      #进行SQLite数据库操作

#region 正则表达式
findLink = re.compile(r'href="../..(.*?)" target')
findTitle=re.compile(r'title="(.*?)">')
findDate=re.compile(r'class="timestyle.*">(.*?)</span>')
#endregion

#主流程
def main():
    #https://www.tjau.edu.cn/tnxw/yxdt.htm
    baseurl = "https://www.tjau.edu.cn/tnxw/yxdt/1.htm"
    datadict= getDate(baseurl)      #爬取网页信息
    dbpath="college.db"
    saveData2DB(datadict,dbpath)        #保存数据至数据库

#爬取网页
def getDate(baseurl):
    datadict= {}
    itemNum = 0  # 提取到第几条信息
    for i in range(1,52):       #调用获取页面信息函数
        url=baseurl[:-5]+str(i)+baseurl[-4:]
        if  i==51:      #最后一页的url有变
            url = baseurl[:-6] +baseurl[-4:]
        print(url)
        html=askURL(url)        #保存获取到得网页源码
        soup = BeautifulSoup(html, "html.parser")
        for item in soup.find_all('tr', height="20"):  # 查找符合要求得字符串，形成列表
            #print("item:%s"%item)
            itemNum+=1
            data = {}  # 保存一部电影得所有信息
            item = str(item)

            #region 正则提取
            # 添加链接
            link=re.findall(findLink,item)[0]
            data["link"]="https://www.tjau.edu.cn"+link

            # 添加标题
            title=re.findall(findTitle,item)[0]
            data["title"]=title.strip()

            # 添加日期
            date=re.findall(findDate,item)[0]
            date= re.sub('\s+', '', date)
            data["date"]=date
            #endregion

            #把提取的信息放入datadict
            datadict[itemNum]=data
    #print("datadict:%s"%datadict)
    return datadict

#得到指定一个URL得网页内容
def askURL(url):
    #模拟浏览器头部信息
    head={
        #用户代理
        "User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5Build/MRA58NAppleWebKit/537.36(KHTML, like Gecko) Chrome/106.0.0.0Mobile Safari/537.36"

    }
    #向网站发送消息
    request=urllib.request.Request(url,headers=head)
    html=""
    try:
        response=urllib.request.urlopen(request)
        html=response.read().decode("utf-8")
        #print(html)
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reason"):
            print(e.reason)
    return html

#保存数据
def saveData2DB(datadict,dbpath):
    init_db(dbpath)
    conn=sqlite3.connect(dbpath)
    cur=conn.cursor()
    for data in datadict:       #从字典中拿一条数据放入entities
        entities = (data,datadict[data]["link"], datadict[data]["title"], datadict[data]["date"])
        # print(entities)
        try:
            cur.execute('INSERT INTO college(id, link, title, date) VALUES(?, ?, ?, ?)', entities)
        except Exception as e:      #主键重复
            #print(e)
            pass
        conn.commit()
    cur.close()
    conn.close()

#初始化数据库
def init_db(dbpath):
    sql='''
        create table if not exists college
        (
            id integer ,
            link text primary key,
            title varchar,
            date date
        )
    '''#创建数据表
    conn=sqlite3.connect(dbpath)
    cursor=conn.cursor()
    cursor.execute(sql)
    conn.commit()
    conn.close()

def test1():
    item = '''
           <tr height="20" id="line53349_0" style="display:none">
           <td nowrap="" width="1"><span class="leaderfont53349"> •  </span></td>
           <td style="font-size:9pt" width="100%">
           <a class="c53349" href="../../info/1038/3600.htm" target="_blank" title="动科动医学院党委召开“两学一做”常态化制度化第二专题学习动员会  ">动科动医学院党委召开“两学一做”常态化制度化第二专题学习动员会
                       </a>
           </td>
           <td nowrap="" width="1%"><span class="timestyle53349">2017-07-07 </span></td>
           <td nowrap="" width="1%"></td>
           </tr>
       '''
    FL = re.compile(r'href="../..(.*?)" target')
    FT = re.compile(r'title="(.*?)">')
    FD = re.compile(r'class="timestyle.*">(.*?)</span>')
    link = re.findall(FL, item)[0]  # re库用来通过正则表达式查找指定的字符串
    title = re.findall(FT, item)[0]  # re库用来通过正则表达式查找指定的字符串
    date = re.findall(FD, item)[0]  # re库用来通过正则表达式查找指定的字符串
    date = re.sub('\s+', '', date)

    print("link:%s" % link)
    print("title:%s" % title)
    print("date:%s" % date)
    data = {}
    data["link"] = "https://www.tjau.edu.cn"+link
    data["title"] = title.strip()
    data["date"] = date
    print(data)

def test2(dbpath):
    datadict={1: {'link': 'https://www.tjau.edu.cn/info/1038/3600.htm', 'title': '动科动医学院党委召开“两学一做”常态化制度化第二专题学习动员会', 'date': '2017-07-07'}, 2: {'link': 'https://www.tjau.edu.cn/info/1038/3493.htm', 'title': '动科动医学院学习传达学习天津市第十一次党代会精神', 'date': '2017-06-02'}, 3: {'link': 'https://www.tjau.edu.cn/info/1038/3492.htm', 'title': '土耳其农业专家来我校进行学术交流', 'date': '2017-06-02'}, 4: {'link': 'https://www.tjau.edu.cn/info/1038/3384.htm', 'title': '农学与资源环境学院生物技术系党支部开展“参观周邓纪念馆 弘扬优良家风”党日活动', 'date': '2017-04-26'}, 5: {'link': 'https://www.tjau.edu.cn/info/1038/3383.htm', 'title': '基础科学学院召开牢固树立“四个意识”主题宣讲报告会', 'date': '2017-04-25'}, 6: {'link': 'https://www.tjau.edu.cn/info/1038/3382.htm', 'title': '动科学院举办百家讲坛说“文化” 讲课大赛', 'date': '2017-04-25'}, 7: {'link': 'https://www.tjau.edu.cn/info/1038/3378.htm', 'title': '工程技术学院召开牢固树立“四个意识”主题宣讲活动', 'date': '2017-04-24'}, 8: {'link': 'https://www.tjau.edu.cn/info/1038/3374.htm', 'title': '园艺园林学院党委召开不作为不担当整治工作专题教育学习推动会', 'date': '2017-04-22'}, 9: {'link': 'https://www.tjau.edu.cn/info/1038/3343.htm', 'title': '动物科学与动物医学学院“牛精英联盟报告交流会”召开', 'date': '2017-04-10'}, 10: {'link': 'https://www.tjau.edu.cn/info/1038/3341.htm', 'title': '动科学院师生参加清明节祭扫活动', 'date': '2017-04-10'}, 11: {'link': 'https://www.tjau.edu.cn/info/1038/3316.htm', 'title': '动物科学与动物医学学院举办宿舍文化节', 'date': '2017-03-29'}, 12: {'link': 'https://www.tjau.edu.cn/info/1038/3313.htm', 'title': '基础科学学院举办“生活与化学”学术沙龙系列活动', 'date': '2017-03-29'}, 13: {'link': 'https://www.tjau.edu.cn/info/1038/3311.htm', 'title': '农学与资源环境学院“农兴论坛”开讲', 'date': '2017-03-28'}, 14: {'link': 'https://www.tjau.edu.cn/info/1038/3261.htm', 'title': '2015级水产养殖学三班参观周邓纪念馆', 'date': '2017-03-09'}, 15: {'link': 'https://www.tjau.edu.cn/info/1038/3248.htm', 'title': '水利工程学院开展“雷锋月”节水宣传活动', 'date': '2017-03-03'}}
    init_db(dbpath)
    conn=sqlite3.connect(dbpath)
    cur=conn.cursor()
    for data in datadict:       #将字典中的一条数据放入entities
        entities = (data,datadict[data]["link"], datadict[data]["title"], datadict[data]["date"])
        cur.execute('INSERT INTO college(id, link, title, date) VALUES(?, ?, ?, ?)', entities)
        conn.commit()
    cur.close()
    conn.close()

def test3():
    init_db("college.db")
    conn=sqlite3.connect(dbpath)
    cur=conn.cursor()
    entities = (1,"www.baidu.com", "标题1", "2022-01-10")
    cur.execute('INSERT INTO college(id, link, title, date) VALUES(?, ?, ?, ?)', entities)
    conn.commit()
    cur.close()
    conn.close()

if __name__ =="__main__":
    main()
    print("爬取成功")
    #getDate("https://www.tjau.edu.cn/tnxw/yxdt/2.htm")
    #askURL("https://www.tjau.edu.cn/tnxw/yxdt.htm")
    #test2("college.db")
    #test3()